/**
 * Mediator 中介者模式
 * 定义：用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式的相互引用，
 *        从而使其耦合松散，而且可以独立地改变它们之间的交互。
 * 要点：
1)将多个对象间复杂的关联关系解耦，Mediator模式将多个对象间的控制逻辑进行集中管理，
  变“多个对象互相关联”为“多个对象和一个中介者关联”，简化了系统的维护，抵御了可能的变化。
2)随着控制逻辑的复杂化，Mediator具体对象的实现可能相当复杂。这时候可以对Mediator对象进行分解处理。
3)Façade模式是解耦系统外到系统内（单向）的对象关联关系；Mediator模式是解耦系统内各个对象之间（双向）的关联关系。
 */

 // 中介者模式 -------------
var unitedNations = {  //Mediator
  colleagueUSA: null,
  colleagueIraq: null,
  declare(message, colleague) {
    if (colleague.name == "美国") {
      this.colleagueIraq.getMessage(message);
    } else if (colleague.name == "伊拉克") {
      this.colleagueUSA.getMessage(message);
    }
  }
}

class Country { //createrMeditar
  constructor(name) {
    this.name = name
    this.mediator = unitedNations
  }
  declare(message) {
    console.log(this.name + "发出声明:" + message)
    this.mediator.declare(message, this)
  }
  getMessage(message) {
    console.log(this.name + "获知声明:" + message)
  }
}

class USA extends Country {
  constructor() {
    super("美国")
  }
}

class Iraq extends Country {
  constructor() {
    super("伊拉克")
  }
}

const usa = new USA()
const iraq = new Iraq()
unitedNations.colleagueUSA = usa
unitedNations.colleagueIraq = iraq
usa.declare("不准研制核武器，否则发动战争")
iraq.declare("我们没有研制核武器")